/**
 * @param {number[]} candidates
 * @param {number} target
 * @return {number[][]}
 */
 var combinationSum2 = function(candidates, target) {
  // 首先对数组去重
  // 然后和之前的回溯是一样的
  candidates = candidates.sort()
  let res = []
  let path = []
  const backTracking = function(sum,startIndex){
    if(sum === target){
      res.push([...path])
      return
    }

    for(let i = startIndex;i < candidates.length && sum <= target;i++){
      if(i > startIndex && candidates[i] === candidates[i-1]){ // 如果当前的值是开始的后一个 并且这个值和前面的值相同说明 这个在这一层已经取过了就不能再取了
        continue
      }
      path.push(candidates[i])
      sum += candidates[i]
      backTracking(sum,i+1)
      sum -= candidates[i]
      path.pop()
    }
  }
  backTracking(0,0)
  return res
};